package com.changgou.search.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.goods.feign.SkuFeign;
import com.changgou.goods.pojo.Sku;
import com.changgou.search.dao.ESManagerMapper;
import com.changgou.search.pojo.SkuInfo;
import com.changgou.search.service.SkuSearchService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class SkuSearchServiceImpl implements SkuSearchService {
    @Autowired
    private ESManagerMapper esManagerMapper;
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
    @Autowired
    private SkuFeign skuFeign;
    /**
     * 创建索引结构
     */
    @Override
    public void createIndexAndMapping() {
        //创建索引
        elasticsearchTemplate.createIndex(SkuInfo.class);
        //创建映射
        elasticsearchTemplate.getMapping(SkuInfo.class);
    }

    /**
     * 导入全部数据到ES索引库
     */
    @Override
    public void importAll() {
        List<Sku> skuList = skuFeign.findListBySpuId("all");
        if (skuList == null || skuList.size()<=0){
            throw new RuntimeException("当前商品数据不存在");
        }
        //查询到的数据是List<Sku>要转为List<SkuInfo>  sku--》skuInfo
        List<SkuInfo> skuInfoList = new ArrayList<>();
        for (Sku sku : skuList) {
            SkuInfo skuInfo = new SkuInfo();
            //第一个参数是要转的bean 第二个是要转为的bean
            BeanUtils.copyProperties(sku,skuInfo);
            //两个id类型不一样。 skuId == string  skuInfoId == long
            skuInfo.setId(Long.parseLong(sku.getId()));
            skuInfo.setSpuId(Long.parseLong(sku.getSpuId()));
            skuInfo.setPrice(Long.parseLong(String.valueOf(sku.getPrice())));
            skuInfo.setCategoryId(Long.parseLong(String.valueOf(sku.getCategoryId())));

            String spec = skuInfo.getSpec();
            if (StringUtils.isEmpty(spec)){
                spec="{}";
            }
            Map mapSpec = JSON.parseObject(spec, Map.class);
            skuInfo.setSpecMap(mapSpec);
            skuInfoList.add(skuInfo);
        }

        esManagerMapper.saveAll(skuInfoList);
    }

    /**
     * 根据spuid导入数据到ES索引库
     * @param spuId 商品id
     */
    @Override
    public void importDataToESBySpuId(String spuId) {
        List<Sku> skuList = skuFeign.findListBySpuId(spuId);
        if (skuList==null || skuList.size()<=0){
            throw new RuntimeException("当前商品不存在");
        }
        //查询到的数据是List<Sku>要转为List<SkuInfo>  sku--》skuInfo
        List<SkuInfo> skuInfoList = new ArrayList<>();
        for (Sku sku : skuList) {
            SkuInfo skuInfo = new SkuInfo();
            //第一个参数是要转的bean 第二个是要转为的bean
            BeanUtils.copyProperties(sku,skuInfo);
            //两个id类型不一样。 skuId == string  skuInfoId == long
            skuInfo.setId(Long.parseLong(sku.getId()));
            skuInfo.setSpuId(Long.parseLong(sku.getSpuId()));
            skuInfo.setPrice(Long.parseLong(String.valueOf(sku.getPrice())));
            skuInfo.setCategoryId(Long.parseLong(String.valueOf(sku.getCategoryId())));

            //spec在数据库是字符 要转为对应的map格式。传到es为json
            String spec = sku.getSpec();
            if (StringUtils.isEmpty(spec)){
                spec="{}";
            }
            Map map = JSON.parseObject(spec, Map.class);
            skuInfo.setSpecMap(map);
            //最后记得把skuInfo塞回去
            skuInfoList.add(skuInfo);
        }

        esManagerMapper.saveAll(skuInfoList);
    }

    @Override
    public void delSkuListBySpuId(String spuId) {
        List<Sku> listBySpuId = skuFeign.findListBySpuId(spuId);
        if (listBySpuId==null || listBySpuId.size()<=0){
            throw new RuntimeException("该商品不存在");
        }
        listBySpuId.forEach((sku -> esManagerMapper.deleteById(Long.parseLong(sku.getId()))));
    }
}
